הבעיה היא שאפילו שכשאני סוגר את הכרטיסייה או החלון הדף ממשיך לעבוד ברקע
do{if(connection_status()!=CONNECTION_NORMAL)break;
sleep(3);
$t=time();
mysql_query("UPDATE users SET time=$t WHERE id=$id");
}while(true);
איך אני יכול לתת BREAK לדף כאשר הדף סגור
16 תשובות
אפילו בלי להבין את הקוד, על השורה הראשונה, בשפה פשוטה:
אין יותר מדי מה להבין (תקן אותי אם אני טועה) - אתה גרמת לזה בעצמך (לא להפסיק את ביצוע הסקריפט כשהלקוח סוגר את החלון).
הקוד הזה בכלל לא מומלץ
ניסיתי לתת עכשיו FALSE ועדיין הוא ממשיך לפעול ברקע..
אני חייב כל פעם לכבות את כל הWAMP כדי לגרום לדף להפסיק להיטען
ומה רע בקוד לא הבנתי..
מה עדיך לפתוח את הדף מחדש כל 3 שניות???
כל משתמש שהוא בעצם "מחובר" אמור לעדכן את השרת ככה שבעצם מתי שהוא עוזב ,כלומר השרת מפסיק להתעדכן ממנו אז מובן מכך שהוא מנותק, הבעיה כאן שאפילו שהמשתמש סגר את החלון בו האתר היה פתוח הדף ממשיך לעבוד ולעדכן את ה"חיים" של המשתמש עם האיידי שלו
למה לא השתמשתי בJS כדי לוודא יציאה?
מיכיוון שלא בכל מקרה אהיה מודע ליציאת המשתמש ועכשיו גם אם יש הפסקת חשמל אני ידע שהמשתמש מנותק..
לא אחי זה כמו צאט רולט..
המטרה בעדכון זה להגיד שהמשתמש עידכן אות חיים פעם אחרונה בTIME() שהיה אז..
זה לא יעבוד ככה. אתה חייב לשלוח פלט לפני שאתה מבצע את הבדיקה.
תעשה echo למשהו. תוכל גם לשלוח null byte:
תשים את השורה הזו לפני התנאי שלך ותגיד אם זה עבד.
המחשב לא ליידי עכשיו אבל מה זה קשור לפלט..
הדף ממשיך את הלולאה ולא נותן break בכלל
בגלל שהתנאי שם תקין ועדיין מחזיר true..
צריך תנאי שיחזיר לי false..
http://www.php.net/manual/en/function.connection-status.php#43273
אז ככה:
ניסיתי:
do{echo chr(0);if(connection_status()!=CONNECTION_NORMAL)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>
לא עבד
ניסיתי:
do{echo chr(0);if(connection_status()!=0)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>
לא עבד
ניסיתי:
do{echo chr(0);if(connection_status()!=0)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>
לא עבד
ניסיתי:
do{echo chr(0);if(connection_status()!=CONNECTION_NORMAL)die;sleep(3);$t=time();mysql_query("UPDATE users SET time=$t WHERE id=$id");}while(true);?>
לא עבד
מישהו יודע מה עוד אפשר לנסות??
1) אולי פשוט תמחק את הקריאה ל ignore_user_abort מהדף?
2) הברירת מחדל של set_time_limit היא 0, וחוץ מזה - הברירת מחדל של max_execution_time היא 30 שניות - אני בטוח שהסקריפט שלך לא מגיע לכמות כזאת של זמן עבור בקשה קטנה.
3) למה לולאת do..while אם הלולאה אין סופית.. עדיף לולאת while רגילה.
5) אתה מבין שהלולאה האין סופית הזאת גורמת לדף להיתקע?
6) זה שיטה מאוד לא יעילה.. ניסית אולי להשתמש בSSE או ווב-סוקטים?
בכללי, עם ווב-סוקטים, כל העניין הזה של צ'אט הופך להיות מאוד קל כשאתה צריך רק קובץ אחד (או שניים מקסימום) לכל הצ'אט.
ניסיתי הכל כבר לא מצאתי שום דרך אם משהו יכול עזור אז תודה
סיימתי הכל כבר ורק החלק הזה תוקע אותי מלהוציא את האתר החוצה
קודם כל הברירת מחדל של set_time_limit בWAMP היא 60 שניות זה דבר ראשון לכן אני חייב להגדיר את זה כ-0
והשתמשתי בDO WHILE מיכיוון שרק בDO WHILE ניתן להריץ את הפעם הראשונה מבלי לעבור על התנאי וזה מה שחיפשתי
מבחינת עבודה זה אותו דבר
http://php.net/manual/en/control-structures.do.while.php
התנאי שאתה מדלג עליו באיטרציה הראשונה הוא true תמיד....
סליחה במקרה הזה זה טיפשי
אבל בשאר הדפים זה נחוץ..
sleep(3);
$re=mysql_fetch_row(mysql_query("SELECT `p` FROM hosts WHERE id='$id' LIMIT 1"));}
while($re[0]==0);